/**
 * hmi 配置数据请求 API 实现
 */

import request, { parseBlobToJson } from "@/utils/request";

// const HMI_CONFIG_BASE_URL = "/api/v1/hmi/config";
const HMI_CONFIG_BASE_URL = "/api/hmi/config";

const HmiConfigAPI = {
  /** 获取 hmi 规则定义 */
  async getTableHeaderRule(): Promise<{ hmiconfig: TableHeaderRule[] }> {
    try {
      // 发送请求并指定responseType为blob
      const response = await request<any, { data: Blob }>({
        url: `${HMI_CONFIG_BASE_URL}/table-header-rule`,
        method: "get",
        responseType: "blob", // 返回文件流
      });
      // console.log("response:", response);
      // 使用FileReader将blob转换为文本
      return parseBlobToJson(response.data);
    } catch (error) {
      console.error("获取HMI配置失败:", error);
      throw error;
    }
  },

  /** 获取 hmi 配置，请求  /hmiconfig.json 路径，接受文件流 */
  async getHmiConfigv1(): Promise<any> {
    try {
      const response = await request<any, any>({
        url: `/hmiconfig.json`,
        method: "get",
        // responseType: "blob", // 返回文件流
      });
      // return parseBlobToJson(response.data);
      return response.data.data;
    } catch (error) {
      console.error("获取HMI配置失败:", error);
      throw error;
    }
  },

  getHmiConfig() {
    return request<any, HmiConfig>({
      url: `/hmiconfig.json`,
      method: "get",
    });
  },

  /** 获取 hmi 菜单定义 */
  async getHmiMenu(): Promise<{ hmimenu: HmiMenu[] }> {
    try {
      const response = await request<any, { data: Blob }>({
        url: `${HMI_CONFIG_BASE_URL}/abb_ref630_menu`,
        method: "get",
        responseType: "blob", // 返回文件流
      });
      return parseBlobToJson(response.data);
    } catch (error) {
      console.error("获取HMI菜单失败:", error);
      throw error;
    }
  },

  /** 获取 hmi 菜单定义，请求  /abb_ref630_menu.json 路径，接受文件流 */
  async getHmiMenuConfigv1(): Promise<any> {
    try {
      const response = await request<any, any>({
        url: `/abb_ref630_menu.json`,
        method: "get",
        // responseType: "blob", // 返回文件流
      });
      // return parseBlobToJson(response.data);
      return response.data.data;
    } catch (error) {
      console.error("获取HMI菜单失败:", error);
      throw error;
    }
  },

  getHmiMenuConfig() {
    return request<any, any>({
      url: `/menu.json`,
      method: "get",
    });
  },
};

export default HmiConfigAPI;

/** hmi 菜单定义 */
export interface HmiMenu {
  /** 路径 */
  path: string;
  /** 组件 */
  component: string;
  /** 名称 */
  name: string;
  /** 元数据 */
  meta: {
    /** 标题 */
    title: string;
    /** 图标 */
    icon: string;
    /** 是否隐藏 */
    hidden: boolean;
    /** 是否总是显示 */
    alwaysShow: boolean;
    /** 参数 */
    params: {
      api: string;
    };
  };
  /** 子菜单 */
  children: HmiMenu[];
}

/**
 * hmi 规则定义，配置数据表格的展示规则；
 *
 */

export interface HmiConfig {
  hmiconfig: TableHeaderRule[];
}

/** 表格配置 */
export interface TableHeaderRule {
  /** 标识路径 */
  path?: string[];
  /** 请求uri */
  uri?: string[];
  /** 描述 */
  description?: string;
  /** 展示规则 */
  showRule?: ShowRule;
  /** 列模块整体配置 */
  columnRule?: ColumnModuleRule;
}

/** 展示规则 */
export interface ShowRule {
  /** 视图配置 */
  view?: ViewRule;
  /** 只查询选项 */
  onlySelectOptions?: OnlySelectOptions;
  /** 批量删除选项 */
  batchDeleteOptions?: BatchDeleteOptions;
  /** 批量更新选项 */
  batchUpdateOptions?: BatchUpdateOptions;
}

/** 视图配置 */
export interface ViewRule {
  /** 是否只查询不改 */
  isOnlySelect?: boolean;
  /** 是否批量更新 */
  isBatchUpdate?: boolean;
  /** 是否批量删除 */
  isBatchDelete?: boolean;
}

/** 只查询选项 */
export interface OnlySelectOptions {
  /** 组 */
  group?: string;
  /** 排序的key */
  orderByKey?: string;
}

/**
 *         "batchDeleteOptions": {
          "isAdd": false,
          "isReset": false,
          "isTrans": true,
          "isDelete": false,
          "isBatchReset": false,
          "isBatchDelete": false,
          "isBatchTrans": true,
          "isDownload": false,
          "idKey": "ID",
          "deleteKey": "index",
          "transApi": "/drvtest_chal/1",
          "updateBodyKey": ["keyname"],
          "updateBodyConfig": {
            "olflag": 1
          }
        }
 * 
 */
/** 批量删除选项 */
export interface BatchDeleteOptions {
  /** 是否新增 */
  isAdd?: boolean;
  /** 是否批量重置 */
  isBatchReset?: boolean;
  /** 是否批量删除 */
  isBatchDelete?: boolean;
  /** 是否批量传动 */
  isBatchTrans?: boolean;
  /** 是否下载 */
  isDownload?: boolean;
  /** 是否重置 */
  isReset?: boolean;
  /** 是否传动 */
  isTrans?: boolean;
  /** 是否删除 */
  isDelete?: boolean;
  /** 删除的key */
  deleteKey?: string;
  /** 重置的key */
  resetKey?: string;
  /** 传动的api */
  transApi?: string;
  /** 传动的body key */
  updateBodyKey?: string[];
  /** 传动的body 配置 */
  updateBodyConfig?: object;
  /** 数据ID的key */
  idKey?: string;
  /** value key */
  updateValueKey?: string;
  /** 是否单个对点 */
  isPoint?: boolean;
  /** 是否批量对点 */
  isBatchPoint?: boolean;
  /** 自动对点API */
  autoPointApi?: string;
  /** 排序的key */
  orderByKey?: string;
  /** 组 */
  group?: string;
}

/** 批量更新选项 */
export interface BatchUpdateOptions {
  /** 组 */
  group?: string;
  /** 数据ID的key */
  idKey?: string;
  /** 数据值的key */
  valueKey?: string;
  /** 值的类型 */
  type?: string;
  /** 是否显示定值区 */
  showSettingZone?: boolean;
  /** 定值区请求路径 */
  settingZoneApi?: string;
  /** 枚举的key */
  enumKey?: string;
  /** 更新请求路径 只有更新API与查询API不同的时候启用*/
  updateApi?: string;
  /** post请求body的 key */
  updateKey?: string;
  /** 更新body 的ID key*/
  updateIdKey?: string;
  /** 更新body 的值 key*/
  updateValueKey?: string;
  /** 更新body 的key */
  updateBodyKey?: string[];
  /** 更新body 的配置 */
  updateBodyConfig?: object;
  /** auto set 更新请求的 api */
  autoSetApi?: string;
  /** auto set 按钮显示标志 */
  showAutoSetButton?: Boolean;
  /** group 参数，数据过滤参数 */
  groups?: string;
  /** orderByKey 参数，数据排序参数 */
  orderByKey?: string;
  /** 启用自动刷新 */
  enableAutoRefresh?: boolean;
}

/** 列模块整体配置 */
export interface ColumnModuleRule {
  /** 只查询不改 */
  onlySelect?: ColumnRule[];
  /** 批量更新 */
  batchUpdate?: ColumnRule[];
  /** 批量删除 */
  batchDelete?: ColumnRule[];
}

/** 列配置 */
export interface ColumnRule {
  /** 列索引 */
  index?: number;
  /** 列名 */
  key?: string;
  /** 列描述 */
  label?: string;
  /** 列类型 */
  type?: string;
  /** 最小列宽度 */
  minWidth?: number;
  /** 列宽度 */
  width?: number;
  /** 列对齐方式 */
  align?: string;
  /** 列排序 */
  sort?: number;
  /** 组合列 */
  combine?: CombineRule;
  /** 是否显示 */
  show?: boolean;
  /** 保留小数 */
  fix?: number;
}

/** 组合列 */
export interface CombineRule {
  /** 组合列的列名 */
  columns?: string[];
  /** 组合列的列描述 */
  format?: string;
}
